/**
* @version 4.0
* @package YAKUSOFT.
* @author Jorge Washington Mueses Cevallos.
* @copyright Copyright (C) 2011 por Jorge Mueses. Todos los derechos reservados.
* @license http://www.gnu.org/copyleft/gpl.html GNU/GPL.
* YAKUSOFT es un software de libre distribución, que puede ser
* copiado y distribuido bajo los términos de la Licencia
* Attribution-NonCommercial-NoDerivs 3.0 Unported,
* de acuerdo con la publicada por la CREATIVE COMMONS CORPORATION.
*/

package ec.com.yaku.seg;

import ec.com.yaku.fact.clases.PuntoEmision;
import ec.com.yaku.lib.Configuracion;
import ec.com.yaku.seg.clases.Auditoria;
import ec.com.yaku.seg.clases.Usuario;
import java.io.*;

import javax.servlet.*;
import javax.servlet.http.*;
import java.sql.ResultSet;
import java.sql.SQLException;


public class Autenticar extends HttpServlet {
    private String _IP = null;
    private int _PUERTO = 5432;
    private String _DB = null;
    private String _USUARIO = null;
    private String _CLAVE = null;

    public void init(ServletConfig config) throws ServletException
    {
        this._IP = config.getServletContext().getInitParameter("_IP");
        this._PUERTO = Integer.parseInt(config.getServletContext().getInitParameter("_PUERTO"));
        this._DB = config.getServletContext().getInitParameter("_DB");
        this._USUARIO = config.getServletContext().getInitParameter("_USUARIO");
        this._CLAVE = config.getServletContext().getInitParameter("_CLAVE");
    }

    /**
    * Procesa peticiones HTTP del m?todo <code>POST</code>.
    * @param request petici?n al servlet
    * @param response respuesta del servlet
    */
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        HttpSession sesion = request.getSession(true);
        response.setContentType("text/html;charset=UTF-8");
        response.setHeader("Pragma", "no-cache");
        response.setHeader("Expires", "Mon, 01 Jan 2001 00:00:01 GMT");
        response.setHeader("Cache-Control", "no-store");
        response.setHeader("Cache-Control", "must-revalidate");
        response.setHeader("Cache-Control", "no-cache");
        
        boolean siIngreso = false;
        String usuario = request.getParameter("usuario");
        String clave = request.getParameter("clave");
        Usuario ubjUsuario = new Usuario(this._IP, this._PUERTO, this._DB, this._USUARIO, this._CLAVE);
        String msg = "Ha ocurrido un error inesperado. Por favor, contáctese con el administrador del sistema para mayor información";
        try{
            msg = "Ha ocurrido un error al conectarse a la base de datos.";
            if(ubjUsuario.getConexion()!=null){
                
                msg = "Ha excedido el límite de licencia una sesiones activas.";
                Configuracion objConfiguracion = new Configuracion(this._IP, this._PUERTO, this._DB, this._USUARIO, this._CLAVE);
                String num_sesiones_activas = objConfiguracion.getValor("sesiones_activas");
                int sesionesActivas = num_sesiones_activas.compareTo("")!=0 ? Integer.parseInt(num_sesiones_activas) : 0;
                objConfiguracion.cerrar();
                if(ubjUsuario.getSesionesActivas()<=sesionesActivas){
                    
                    msg = "Usuario o Contraseña incorrectos.";
                    ResultSet id_r = ubjUsuario.autenticar(usuario, clave);
                    if(id_r != null){
                        if(id_r.next()){
                            
                            msg = "No tiene permiso para autenticarse ya que su usuario está inactivo.";
                            String perfil = (id_r.getString("perfil")!=null) ? id_r.getString("perfil") : "";
                            //String nombre_usuario = (id_r.getString("nombre_usuario")!=null) ? id_r.getString("nombre_usuario") : "";
                            boolean estado = (id_r.getString("estado")!=null) ? id_r.getBoolean("estado") : false;
                            if(estado){
                                // GUARDO LA NUEVA SESION
                                ubjUsuario.setSesion(usuario, sesion.getId());
                                String ip = request.getRemoteAddr();

                                PuntoEmision objPuntoEmision = new PuntoEmision(this._IP, this._PUERTO, this._DB, this._USUARIO, this._CLAVE);
                                String id_punto_emision = objPuntoEmision.getIdpunto_emision(usuario);
                                objPuntoEmision.cerrar();

                                sesion.setAttribute("usuario", usuario);
                                sesion.setAttribute("perfil", perfil);
                                sesion.setAttribute("ip", ip);
                                sesion.setAttribute("id_punto_emision", id_punto_emision);
                                //sesion.setAttribute("nombre_usuario", nombre_usuario);
                                sesion.setAttribute("cierre", "");

                                Auditoria auditoria = new Auditoria(this._IP, this._PUERTO, this._DB, this._USUARIO, this._CLAVE);
                                auditoria.setRegistro(usuario, ip, "INICIO DE SESION DEL USUARIO: "+usuario);
                                auditoria.cerrar();

                                siIngreso = true;
                            }
                            id_r.close();
                        }
                    }
                }
            }
        }catch(SQLException e){
            e.printStackTrace();
        }finally{
            ubjUsuario.cerrar();
        }
        
        if(siIngreso){
            response.sendRedirect("index.html");
        }else{
            response.sendRedirect("index.jsp?msg="+msg);
        }
    }

}
